/*
设置 i 为窗口起始位置，n 为数组长度，min_size 为当前窗口内的和，ans 为记录最小子数组长度的变量（初始化为 n+1）。
用 j 遍历数组，逐步将元素加到 min_size。
当 min_size 大于等于 target 时，更新 ans 为当前窗口的长度 j - i + 1，然后通过移动起始位置 i 缩小窗口，直到 min_size 小于 target。
如果 ans 还是 n+1，说明没有找到符合条件的子数组，返回 0；否则返回 ans。
*/
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int i = 0, n = nums.size();
        long long min_size = 0;
        int ans = n + 1;
        for(int j = 0; j < n; j++)
        {
            min_size += nums[j];
            while(min_size >= target)
            {
                ans = min(ans, j - i + 1);
                min_size -= nums[i++];
            }
        }
        return ans > n ? 0 : ans;
    }
};